﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Modelo_ETdA.Negocio.Analise;
using Modelo_ETdA.Negocio.Analise.Formato;
using Modelo_ETdA.Negocio.Analise.Avaliacao;
using Modelo_ETdA.Negocio.AmbienteComercial;

namespace Modelo_ETdA.Interface
{
    public partial class RegistarAvaliacaoAnalista : Form
    {
        private GestorAnalise gest_anal;
        private FormatoAvaliacaoAnalista form_anal;
        private DataTable tabela = new DataTable();
        private List<Consideracao> consideracoes;
        private MenuAnaliseETdA menuAnalEtda;
        private List<Divisao> listaZonas;
        private Dictionary<string, Divisao> dicDivs;

        public RegistarAvaliacaoAnalista(MenuAnaliseETdA menuAnalEtda, GestorAnalise gestor, FormatoAvaliacao formato)
        {
            //todo ler cod formato
            InitializeComponent();
            this.gest_anal = gestor;
            this.menuAnalEtda = menuAnalEtda;
            this.form_anal = (FormatoAvaliacaoAnalista)formato;
            dicDivs = new Dictionary<string, Divisao>();
            inicializaTabela();
        }

        private void inicializaTabela()
        {
            DataRow workRow;
            tabela.Columns.Add("codCons");
            tabela.Columns.Add("Consideração");
            tabela.Columns["Consideração"].ReadOnly = true;

            string tipo;
            if (gest_anal.AmbComercialSessao.orientadoZona)
                tipo = "Z";
            else
                tipo = "T";
            listaZonas = gest_anal.AmbComercialSessao.listDivisao;

            foreach (Divisao div in listaZonas)
            {
                tabela.Columns.Add(tipo + div.CodRelativo + " - " + div.Descricao);
                dicDivs.Add(tipo + div.CodRelativo + " - " + div.Descricao, div);
            }

            consideracoes = gest_anal.consultaListaConsideracao();
            foreach (Consideracao cons in consideracoes)
            {
                workRow = tabela.NewRow();
                workRow["Consideração"] = cons.Descricao;
                workRow["codCons"] = cons.Cod;
                tabela.Rows.Add(workRow);
            }
            try
            {
                tabelaQuest.DataSource = tabela;
                tabelaQuest.Columns["codCons"].Visible = false;
                tabelaQuest.Rows[0].Visible = false;
                tabelaQuest.Rows[0].Height = 0;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        private bool validaDados()
        {
            int inserido;
            if (nomeAval.TextLength == 0)
            {
                MessageBox.Show("O nome da inserido é inválido!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            
            if (valRuido.TextLength == 0)
            {
                MessageBox.Show("O Valor da medida de ruído não foi inserido correctamente!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (valTemp.TextLength == 0)
            {
                MessageBox.Show("O Valor da medida de temperatura não foi inserido correctamente!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (valLum.TextLength == 0)
            {
                MessageBox.Show("O Valor da medida de luminosidade não foi inserido correctamente!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            try
            {
                if (Convert.ToInt32(valRuido.Text) < 0)
                {
                    MessageBox.Show("O Valor da medida de ruído não pode ser negativa!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

                for (int i = 1; i < consideracoes.Count; i++)
                {
                    for (int j = 1; j < listaZonas.Count + 1; j++)
                    {
                        inserido = Convert.ToInt32(tabelaQuest.Rows[i].Cells[j + 1].Value);
                        if (inserido > 5 || inserido < 1)
                        {
                            if (gest_anal.AmbComercialSessao.orientadoZona)
                                MessageBox.Show("O valor inserido na consideração " + tabelaQuest.Rows[i].Cells[1].Value + " para a zona " + tabelaQuest.Columns[j+1].HeaderText+ " é inválido.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            else MessageBox.Show("O valor inserido na consideração " + tabelaQuest.Rows[i].Cells[1].Value + " para a tarefa " + tabelaQuest.Columns[j + 1].HeaderText + " é inválido.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return false;
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                MessageBox.Show("Possui respostas com valores inválidos.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        private void registar_Click(object sender, EventArgs e)
        {
            try
            {
                if (validaDados())
                {
                    Checklist n_aval;
                    DocumentoCabecalho cab = new DocumentoCabecalho(nomeAval.Text, "Analista", new DateTime(), 2);
                    n_aval = new Checklist(form_anal.CodBD, cab, gest_anal.AmbComercialSessao.Cabeçalho.Cod, Convert.ToInt32(valRuido.Text), Convert.ToInt32(valTemp.Text), Convert.ToInt32(valLum.Text));
                    for (int i = 0; i < consideracoes.Count; i++)
                    {
                        for (int j = 2; j < listaZonas.Count + 2; j++)
                        {
                            {
                                int codCons = Convert.ToInt32(tabelaQuest.Rows[i].Cells[0].Value);
                                int valorT = Convert.ToInt32(tabelaQuest.Rows[i].Cells[j].Value);
                                int codForm = form_anal.CodBD;
                                int codDivRel = dicDivs[tabelaQuest.Columns[j].Name].CodRelativo;
                                int codDivBd = gest_anal.getCodQuestao(codCons, codDivRel, codForm);
                                Resposta resp = new Resposta(-1, codDivBd, valorT);
                                n_aval.Respostas.Add(resp);
                            }
                        }
                    }
                    int verif = gest_anal.registChecklist(n_aval);
                    if (verif == 2)
                    {
                        MessageBox.Show("Uma avaliação com o mesmo nome já se encontra registada!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    else if (verif == 0)
                    {
                        MessageBox.Show("Avaliação inserida com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        menuAnalEtda.Visible = true;
                        this.Visible = false;
                        return;
                    }
                    else MessageBox.Show("Erro ao registar avalição", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
            catch (Exception exp)
            {
                MessageBox.Show("Erro ao registar avalição", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void voltar_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            menuAnalEtda.Visible = true;
        }

        private void RegistarAvaliacaoAnalista_FormClosed(object sender, FormClosedEventArgs e)
        {
            menuAnalEtda.sair();
        }

    }
}
